package contatos.presenter;

import contatos.collection.Contatos;
import contatos.model.Contato;
import contatos.patterns.chainofresponsbility.EShandler;
import contatos.patterns.chainofresponsbility.RJHandler;
import contatos.patterns.chainofresponsbility.SPhandler;
import contatos.patterns.chainofresponsbility.TelefoneProcessor;
import contatos.view.ManterContatoView;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

public abstract class ManterContatoPresenter {

    Contatos contatos;
    ManterContatoView view;
    TelefoneProcessor telefoneProcessor;

    public ManterContatoPresenter() {

        try {
            contatos = Contatos.getInstancia();
            view = new ManterContatoView();

            //tratador de uf e operadora
            //uso do padrão chain of responsibility
            telefoneProcessor = new TelefoneProcessor();
            telefoneProcessor.addTelefoneHandler(new EShandler());
            telefoneProcessor.addTelefoneHandler(new RJHandler());
            telefoneProcessor.addTelefoneHandler(new SPhandler());

            //listeners
            view.getBtnSalvar().addActionListener(new java.awt.event.ActionListener() {

                @Override
                public void actionPerformed(java.awt.event.ActionEvent evt) {
                    manterPessoa();
                }
            });

            view.getBtnFechar().addActionListener(new java.awt.event.ActionListener() {

                @Override
                public void actionPerformed(java.awt.event.ActionEvent evt) {
                    view.setVisible(false);
                    view.dispose();
                }
            });

            view.getTxtOperadora().addKeyListener(new KeyAdapter() {
                @Override
                public void keyTyped(final KeyEvent e) {
                    SwingUtilities.invokeLater(new Runnable() {
                        @Override
                        public void run() {
                            JTextField campo = (JTextField) e.getSource();
                            int posicaoCursor = campo.getCaretPosition();
                            campo.setText(campo.getText().toUpperCase());
                            if (posicaoCursor != campo.getCaretPosition()) {
                                campo.setCaretPosition(posicaoCursor);
                            }
                        }
                    });
                }
            });

            view.getTxtTelefone().addFocusListener(new FocusAdapter() {

                @Override
                public void focusLost(FocusEvent e) {
                    identificaUfOperadora(view.getTxtTelefone().getText());
                }
            });

//            view.getTxtTelefone().addKeyListener(new KeyAdapter() {
//
//                @Override
//                public void keyTyped(KeyEvent e) {
//                    JTextField campo = (JTextField) e.getSource();
//                    int posicaoCursor = campo.getCaretPosition();
//                    if (posicaoCursor == 4) {
//                        try { 
//                            MaskFormatter formatter = new MaskFormatter("(##)####-####");
//                            DefaultFormatterFactory factory;
//                            String ddd = campo.getText().substring(1, 3);
//                            if (ddd.equals("28")) {
//                                formatter = new MaskFormatter("(##)#####-####");
//                            } else {
//                            }
//                            factory = new DefaultFormatterFactory(formatter);
//                            view.getTxtTelefone().setFormatterFactory(factory);
//                            view.getTxtTelefone().setText(ddd);
//
//                        } catch (ParseException ex) {
//                            Logger.getLogger(ManterContatoPresenter.class.getName()).log(Level.SEVERE, null, ex);
//                        }
//                    }
//                }
//
//            });
            
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(view, ex.getMessage());
        }

    }

    abstract void manterPessoa();

    void identificaUfOperadora(String telefone) {
        //removendo os caracteres especiais
        telefone = telefone.replace("(", "").replace(")", "").trim();

        //chama a cadeia para identificar a UF e OPERADORA
        Contato p = new Contato("", telefone, "", "");
        telefoneProcessor.handleRequest(p);

        //se não foi possível identificar a operadora não sobrescreve o campo
        if (!p.getUf().equals("")) {
            view.getTxtUF().setText(p.getUf());
        }
        if (!p.getOperadora().equals("")) {
            view.getTxtOperadora().setText(p.getOperadora());
        }
       
    }
}
